package com.general.framework.aop.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aop.annotation.LogAnnotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Aspect
@Component
@Slf4j
public class LogAspect {
    /**
     * 定义切点，只要标注了@LogAnnotation注解的方法都会被拦截
     */
    @Pointcut("@annotation(org.aop.annotation.LogAnnotation)")
    public void logPointCut(){
        //切点

    }

    /**
     * 环绕通知，在标注了@LogAnnotation注解的方法执行前后都会执行
     * @param point 连接点用于执行目标方法，它对应的就是被拦截的方法
     * @return
     * @throws Throwable
     */
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable{
        String name = point.getSignature().getName();
        // 获取注解，并获取注解的值
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();
        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
        if(annotation != null){
            log.info("方法描述：{}",annotation.value());
        }
        log.info("执行方法前：{}",name);
        //执行方法前
        Object result = point.proceed();
        log.info("执行方法后：{}",name);
        //执行方法后
        return result;
    }
}
